<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Maven 培训文档</title>
    <link rel="preconnect" href="https://fonts.googleapis.com">
    <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
    <link href="https://fonts.googleapis.com/css2?family=Merriweather:wght@400;700&family=Inter:wght@400;700&family=IBM+Plex+Mono&display=swap" rel="stylesheet">
    <style>
        body {
            font-family: 'Inter', sans-serif;
            line-height: 1.7; /* Increased for better readability */
            color: #212529; /* Darker text for high contrast, from prompt */
            background-color: #f8f9fa; /* Light gray background, from prompt */
            margin: 0;
            padding: 20px; /* Add some padding around the container */
            display: flex;
            justify-content: center;
        }
        body::before { /* Subtle grid pattern, from prompt */
            content: "";
            position: fixed;
            top: 0;
            left: 0;
            width: 100vw;
            height: 100vh;
            background-image: url("data:image/svg+xml,%3Csvg width='30' height='30' viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0 15h30M15 0v30' stroke='%23000000' stroke-width='0.1' stroke-opacity='0.05'/%3E%3C/svg%3E");
            z-index: -1;
        }
        .container {
            max-width: 800px; /* Slightly narrower for better line length */
            width: 100%;
            margin: 20px auto; /* More vertical margin */
            padding: 40px; /* More padding inside container */
            background-color: #ffffff; /* White content background, from prompt */
            box-shadow: 0 4px 20px rgba(0,0,0,0.07); /* Softer, more modern shadow */
            border-radius: 10px; /* Slightly more rounded corners */
            border: 1px solid #dee2e6; /* Subtle border for card effect */
        }
        h1, h2, h3, h4, h5, h6 {
            font-family: 'Merriweather', serif; /* Elegant serif for titles, from prompt */
            font-weight: 700;
            color: #1a1a1a; /* Very dark, almost black for titles */
            margin-top: 1.8em;
            margin-bottom: 0.6em;
            line-height: 1.3;
        }
        h1 { font-size: 2.4em; border-bottom: 2px solid #3b82f6; padding-bottom: 0.3em; } /* Added border for H1 */
        h2 { font-size: 1.9em; border-bottom: 1px solid #e0e0e0; padding-bottom: 0.2em; } /* Added border for H2 */
        h3 { font-size: 1.6em; }
        p, ul, ol {
            margin-bottom: 1.2em; /* More spacing after paragraphs/lists */
            font-size: 1rem; /* Base font size for body text */
        }
        ul, ol {
            padding-left: 1.8em; /* More indentation for lists */
        }
        li {
            margin-bottom: 0.6em;
        }
        pre {
            font-family: 'IBM Plex Mono', monospace; /* Monospace for code, from prompt */
            background-color: #f1f3f5; /* Slightly different code bg */
            padding: 1em 1.2em;
            border-radius: 6px; /* Consistent with container */
            overflow-x: auto;
            border: 1px solid #ced4da;
            font-size: 0.9em;
            line-height: 1.5;
            box-shadow: 0 2px 5px rgba(0,0,0,0.05); /* Subtle shadow for code blocks */
        }
        code { /* Inline code */
            font-family: 'IBM Plex Mono', monospace;
            background-color: #e9ecef;
            padding: 0.2em 0.5em; /* Slightly more padding */
            border-radius: 4px;
            font-size: 0.875em; /* Slightly smaller inline code */
            color: #c92a2a; /* A subtle color for inline code */
        }
        pre code { /* Reset for code inside pre */
            background-color: transparent;
            padding: 0;
            border-radius: 0;
            font-size: inherit;
            color: inherit; /* Inherit color from pre */
            border: none;
            box-shadow: none;
        }
        a {
            color: #3b82f6; /* Bright blue for links, from prompt */
            text-decoration: none;
            font-weight: 500; /* Slightly bolder links */
            transition: color 0.2s ease-in-out;
        }
        a:hover {
            color: #2563eb; /* Darker blue on hover */
            text-decoration: underline;
        }
        strong {
            font-weight: 700;
            color: #000; /* Make strong text black for emphasis */
        }
        /* Responsive adjustments */
        @media (max-width: 768px) {
            body { padding: 10px; }
            .container { padding: 20px; margin: 10px auto; }
            h1 { font-size: 2em; }
            h2 { font-size: 1.7em; }
            h3 { font-size: 1.4em; }
            p, ul, ol { font-size: 0.95rem; }
        }
    </style>
</head>
<body>
    <div class="container">
        <h1>Maven 培训文档</h1>

        <h2>1. Maven 是什么？</h2>
        <p>Maven 是一个强大的项目管理和构建自动化工具，主要用于 Java 项目。它可以帮助我们管理项目的依赖（即项目所需的外部库）、构建项目（编译代码、打包等）、生成文档等。</p>
        <p>简单来说，Maven 就像一个项目的“管家”，它能帮你处理很多繁琐的事情，让你更专注于代码编写。</p>

        <h2>2. 常用 Maven 命令</h2>
        <p>Maven 命令通常在项目的根目录（即包含 <code>pom.xml</code> 文件的目录）下通过命令行工具（如 PowerShell 或 CMD）运行。格式为 <code>mvn [phase]</code> 或 <code>mvn [plugin:goal]</code>。</p>
        <p>以下是一些常用的 Maven 命令：</p>
        <ul>
            <li><strong><code>mvn clean</code></strong>: 清理项目，删除 <code>target</code> 目录（构建输出目录）。
                <pre><code class="language-bash">mvn clean</code></pre>
            </li>
            <li><strong><code>mvn compile</code></strong>: 编译项目的源代码。编译后的 <code>.class</code> 文件会放在 <code>target/classes</code> 目录下。
                <pre><code class="language-bash">mvn compile</code></pre>
            </li>
            <li><strong><code>mvn test</code></strong>: 运行项目的单元测试。测试报告通常在 <code>target/surefire-reports</code> 目录下。
                <pre><code class="language-bash">mvn test</code></pre>
            </li>
            <li><strong><code>mvn package</code></strong>: 将项目打包。对于普通的 Java 项目，会生成一个 JAR 文件；对于 Web 项目，会生成一个 WAR 文件。包文件会放在 <code>target</code> 目录下。
                <pre><code class="language-bash">mvn package</code></pre>
            </li>
            <li><strong><code>mvn install</code></strong>: 将项目打包并安装到本地仓库。这样，你本地的其他 Maven 项目就可以依赖这个项目了。
                <pre><code class="language-bash">mvn install</code></pre>
            </li>
            <li><strong><code>mvn deploy</code></strong>: 将项目打包并部署到远程仓库（通常是私服或中央仓库，需要配置）。
                <pre><code class="language-bash">mvn deploy</code></pre>
            </li>
            <li><strong><code>mvn clean install</code></strong>: 组合命令，先清理项目，然后打包并安装到本地仓库。这是非常常用的命令。
                <pre><code class="language-bash">mvn clean install</code></pre>
            </li>
        </ul>

        <h2>3. 创建一个简单的 Maven 项目 (Hello World)</h2>
        <p>我们可以使用 Maven Archetype 插件来快速创建一个项目骨架。</p>
        <ol>
            <li><strong>打开命令行工具</strong> (PowerShell 或 CMD)。</li>
            <li><strong>导航到一个你希望创建项目的目录</strong>，例如 <code>E:\project</code>。
                <pre><code class="language-bash">cd E:\project</code></pre>
            </li>
            <li><strong>运行以下命令</strong>：
                <pre><code class="language-bash">mvn archetype:generate -DgroupId=com.example -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false</code></pre>
                <p>windows下由于空格解析的问题，请加入双引号</p>
                <pre><code class="language-bash">mvn archetype:generate "-DgroupId=com.example" "-DartifactId=my-app" "-DarchetypeArtifactId=maven-archetype-quickstart" "-DinteractiveMode=false"</code></pre>
                <p>参数说明：</p>
                <ul>
                    <li><code>archetype:generate</code>：告诉 Maven 使用 Archetype 插件的 <code>generate</code> 目标。</li>
                    <li><code>-DgroupId=com.example</code>：设置项目的 <code>groupId</code>。</li>
                    <li><code>-DartifactId=my-app</code>：设置项目的 <code>artifactId</code>。</li>
                    <li><code>-DarchetypeArtifactId=maven-archetype-quickstart</code>：指定使用 <code>maven-archetype-quickstart</code> 这个原型，它会创建一个简单的 Java 项目结构。</li>
                    <li><code>-DinteractiveMode=false</code>：非交互模式，直接使用提供的参数创建项目，不会提示输入版本号等信息（默认会使用最新的 archetype 版本和 <code>1.0-SNAPSHOT</code> 作为项目版本）。</li>
                </ul>
                <p>命令执行成功后，你会在当前目录下看到一个名为 <code>my-app</code> 的新文件夹。</p>
            </li>
            <li><strong>项目结构</strong>：
                <p>进入 <code>my-app</code> 文件夹，你会看到类似这样的结构：</p>
                <pre><code>my-app/
├── pom.xml
└── src/
    ├── main/
    │   └── java/
    │       └── com/
    │           └── example/
    │               └── App.java
    └── test/
        └── java/
            └── com/
                └── example/
                    └── AppTest.java</code></pre>
                <ul>
                    <li><code>pom.xml</code>：项目的 Maven 配置文件。</li>
                    <li><code>src/main/java</code>：存放项目的主要 Java 源代码。</li>
                    <li><code>src/test/java</code>：存放项目的测试代码。</li>
                </ul>
            </li>
            <li><strong>查看 <code>pom.xml</code></strong>：
                <p>打开 <code>my-app/pom.xml</code> 文件，你会看到类似下面的内容：</p>
                <pre><code class="language-xml">&lt;project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"&gt;
  &lt;modelVersion&gt;4.0.0&lt;/modelVersion&gt;

  &lt;groupId&gt;com.example&lt;/groupId&gt;
  &lt;artifactId&gt;my-app&lt;/artifactId&gt;
  &lt;version&gt;1.0-SNAPSHOT&lt;/version&gt;
  &lt;packaging&gt;jar&lt;/packaging&gt;

  &lt;name&gt;my-app&lt;/name&gt;
  &lt;url&gt;http://maven.apache.org&lt;/url&gt;

  &lt;properties&gt;
    &lt;project.build.sourceEncoding&gt;UTF-8&lt;/project.build.sourceEncoding&gt;
    &lt;maven.compiler.source&gt;1.7&lt;/maven.compiler.source&gt; &lt;!-- 注意：这里默认可能是1.7，建议修改为更新的Java版本，如1.8, 11, 17 --&gt;
    &lt;maven.compiler.target&gt;1.7&lt;/maven.compiler.target&gt; &lt;!-- 注意：同上 --&gt;
  &lt;/properties&gt;

  &lt;dependencies&gt;
    &lt;dependency&gt;
      &lt;groupId&gt;junit&lt;/groupId&gt;
      &lt;artifactId&gt;junit&lt;/artifactId&gt;
      &lt;version&gt;4.11&lt;/version&gt; &lt;!-- 默认的 JUnit 版本，可以更新 --&gt;
      &lt;scope&gt;test&lt;/scope&gt;
    &lt;/dependency&gt;
  &lt;/dependencies&gt;

  &lt;build&gt;
    &lt;plugins&gt;
      &lt;!-- 可以添加或配置更多插件 --&gt;
    &lt;/plugins&gt;
  &lt;/build&gt;
&lt;/project&gt;</code></pre>
                <p><strong>建议修改</strong>：</p>
                <ul>
                    <li>将 <code>&lt;maven.compiler.source&gt;</code> 和 <code>&lt;maven.compiler.target&gt;</code> 的值修改为你希望使用的 Java 版本，例如 <code>1.8</code> 或 <code>11</code> 或 <code>17</code>。</li>
                    <li>可以更新 JUnit 的版本，或者根据需要添加其他依赖。</li>
                </ul>
            </li>
            <li><strong>构建和运行项目</strong>：
                <p>在 <code>my-app</code> 目录下打开命令行，执行：</p>
                <pre><code class="language-bash">mvn package</code></pre>
                <p>这会编译代码、运行测试并打包成一个 JAR 文件，位于 <code>my-app/target/my-app-1.0-SNAPSHOT.jar</code>。</p>
                <p>你可以运行这个 JAR 包（如果 <code>App.java</code> 中有 <code>main</code> 方法并且正确配置了 <code>maven-jar-plugin</code> 来指定主类）：</p>
                <pre><code class="language-bash">java -cp target/my-app-1.0-SNAPSHOT.jar com.example.App</code></pre>
                <p>默认的 <code>App.java</code> 包含一个简单的 <code>main</code> 方法，会打印 "Hello World!"。</p>
            </li>
        </ol>
    </div>
</body>
</html>